/*******************************************************************************
* 版权：北京润尼尔网络科技有限公司，保留所有版权<br>
* 版本：v1.0.0<br>
* 文件：AppControlComponent.js<br>
* 日期：2017年9月29日<br>
* 作者: 李伟利<br>
* 功能：应用程序组件对象基类，定义组件对象基本接口<br>
* 
* 修改记录：<br>
* 日期 描述 更新功能<br>
******************************************************************************/
 
window.makeNamespace(window,"Rainier.UI.V2");

Rainier.UI.V2.AppControlComponent = Rainier.UI.V2.AppViewComponent.extend({

    NAME : "Rainier.UI.V2.AppControlComponent",

    /**
     * 函数名称：init<br>
     * 函数功能：构造函数<br>
     * 参数信息：app : 应用程序对象，
     * 异常信息：无<br>
     */
    init : function(app,parentContainer){
        this._super(app,parentContainer);
        this.container = $('<div class="app-control"></div>');
    },

    /**
     * 函数名称：createView<br>
     * 函数功能：根据参数信息： 是否存在容器元素，进行不同形式的布局设置<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    createView : function(){
         if(this.parentContainer){
            this.container.appendTo(this.parentContainer);
        }else{
            this.container.appendTo($("body"));
        }
        var ulContainer     = $("<ul></ul>");
        ulContainer.appendTo(this.container);

        this.partLibControl     = this.createViewDom("app-part app-control-btn-part","器材");
        this.experimentalResult = this.createViewDom("app-experimental app-control-btn-result","实验结果");
        this.runControl         = this.createViewDom("app-run app-control-btn-run","运行");

        ulContainer.append(this.partLibControl);
        ulContainer.append(this.experimentalResult);
        ulContainer.append(this.runControl);

        $(".app-stop").attr("data-flag",true);
        this.bindCallBackFn();
    },

    /**
     * 函数名称：createViewDom<br>
     * 函数功能：创建当前组件的dom元素<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    createViewDom : function(btnClass,text){
        var dom = new String() +
                    '<li title='+text+'>'+
                    '   <a class="app-control-btn '+btnClass+'" data-flag="'+false+'"></a>'+
                    '   <span class="app-control-text">'+text+'</span>'+
                    '</li>';
        return $(dom);
    },

    /**
     * 函数名称：createView<br>
     * 函数功能：对组件中的控制元素，进行事件绑定，此处，调用context内部的功能函数<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    bindCallBackFn : function(){
        var _this = this;
        this.partLibControl.on("click",function(event){
            _this.partLibCallBackFn(event);
        });

        this.experimentalResult.on("click",function(event){
            _this.experimentalResultCallBackFn(event);
        });

        this.runControl.on("click",function(event){
            _this.runningCallBackFn(event);
        });
    },

    /**
     * 函数名称：partLibCallBackfn<br>
     * 函数功能：对组件中的控制元素，进行事件绑定，此处，调用context内部的功能函数<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    partLibCallBackFn : function(event){
        var target = $(event.target).children(":first-child").prevObject;
        var flag   = target.data("flag");
        if(typeof flag == "undefined"){
            return false;
        }
        if(!flag){
            target.removeClass("app-control-btn-part").addClass("app-control-btn-part-on");
            target.data("flag",true);
        }else{
            target.removeClass("app-control-btn-part-on").addClass("app-control-btn-part");
            target.data("flag",false);
        }
        this.context.clickToControlPartLib(!flag);
        this.stopEventPropagation(event);
    },

    /**
     * 函数名称：analyseCallBackFn<br>
     * 函数功能：添加仿真分析类型，完成仿真分析类型的设置<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    experimentalResultCallBackFn : function(event){
        var target = $(event.target).children(":first-child").prevObject;
        var flag   = target.data("flag");
        if(typeof flag == "undefined"){
            return false;
        }
        if(!flag){
            target.removeClass("app-control-btn-result").addClass("app-control-btn-result-on");
            target.data("flag",true);
        }else{
            target.removeClass("app-control-btn-result-on").addClass("app-control-btn-result");
            target.data("flag",false);
        }
        this.context.clickToControlResult(!flag);
        this.stopEventPropagation(event);
    },

    /**
     * 函数名称：runningCallBackFn<br>
     * 函数功能：对组件中的控制元素，进行事件绑定，此处，调用context内部的功能函数<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    runningCallBackFn : function(event){
        var currentState = this.context.webSocket.getReadyState();
        if(currentState !== 1){
            $.messager.alert('提示','解算引擎正在启动或尚未启动，若已启动，请稍候，正在连接......！','warning');
            return;
        }
        var target = $(event.target).children(":first-child").prevObject;
        var flag   = target.data("flag");
        if(typeof flag == "undefined"){
            return false;
        }
        if(!flag){
            target.removeClass("app-control-btn-run").addClass("app-control-btn-run-on");
            this.context.clickToControlRunState();
            this.runToControlResult();
            this.context.clickToAnalyticalResults();
        }

        this.stopEventPropagation(event);
        this.addRunningShade();
        // this.runControl.css('display','none')
        // setTimeout($.proxy(function(){
        //     target.removeClass("app-control-btn-run-on").addClass("app-control-btn-run");
        //     // this.runControl.css('display','block')
        // },this),3000)
    },

    /**
     * 函数名称：addRunningShade<br>
     * 函数功能：点击运行时，控制实验结果按钮的状态<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    runToControlResult : function(){
        var resultBtn = $(".app-experimental");
        resultBtn.removeClass("app-control-btn-result").addClass("app-control-btn-result-on");
        resultBtn.data("flag",true);
    },

    /**
     * 函数名称：addRunningShade<br>
     * 函数功能：添加运行时遮罩<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    addRunningShade : function(){
        this.runningShade = $('<div class="app-running-shade"></div>');
        this.runningShade.appendTo($("body"));
    },
   
    /**
     * 函数名称：enableComponent<br>
     * 函数功能：启用组件内部功能<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    enableComponent : function(){
        throw new Error("此函数有子类实现,当前对象可理解为抽象类，不向外提供实例，谢谢配合");
    },

    /**
     * 函数名称：disableComponent<br>
     * 函数功能：禁用组件功能<br>
     * 参数输入：无<br>
     * 函数返回：无<br>
     * 异常信息：无<br>
     */
    disableComponent : function(){
        throw new Error("此函数有子类实现,当前对象可理解为抽象类，不向外提供实例，谢谢配合");
    },
});